
--熟悉基础的调试函数 lua动态改变变量
--[[
    1.返回函数信息表
    getinfo ([thread,] f [, what])
    0 层表示当前函数（getinfo 自身）； 1 层表示调用 getinfo 的函数 （除非是尾调用，这种情况不计入栈）；
    等等。 如果 f 是一个比活动函数数量还大的数字， getinfo 返回 nil。
    2.获取局部变量
    debug.getlocal ([thread,] f, local) --直接改变局部变量即可
    3.将 value 设为函数 f 的第 up 个上值。 如果函数没有那个上值，返回 nil 否则，返回该上值的名字。
    setupvalue (f, up, value):
    函数引用的非局部变量
]]

-- local function myfun()
--     local a = 10
--     local info = debug.getinfo(1)
--     for k, v in pairs(info) do
--         print(string.format('%20s, %s', k, v))
--     end
-- end
-- myfun()

--[[
        nparams, 0
        func, function: 0x60000236bf90
        name, myfun
        what, Lua
        linedefined, 1
        currentline, 3
        istailcall, false
        nups, 1
        ntransfer, 0
        ftransfer, 0
        namewhat, local
        short_src, examples/mytest/hot_fix_test/hot_fix_2.lua
        source, @examples/mytest/hot_fix_test/hot_fix_2.lua
        isvararg, false
        lastlinedefined, 7
]]


-- local name, val
-- local function myfun(var)
--     local a = 10
--     local index = 1
--     g = 108
--     repeat
--         name, val = debug.getlocal(1, index)
--         print(index, name, val)
--         index = index + 1
--     until not name
-- end

-- myfun(100)

--[[
    var 100
    a 10
    index 3
    nil nil
]]


local function ch_up(f, name_, f_)
    local i = 1
    while true do
        local name, value = debug.getupvalue(f, i)
        if name == nil then
            return false
        end
        if name == name_ then
            --将f_设置为f的第i个上值，无值返回nil，否则返回名字
            debug.setupvalue(f, i, f_)
            return true
        end
        i = i + 1
    end
end

local function test()
    print('raw test')
end

local wrap_test = function()
    test()
end
wrap_test()

ch_up(wrap_test, 'test',
    --将匿名函数设置为wrap_test的上值
    function()
        print('new test')
    end)
wrap_test()

--[[
    raw test
    new test
]]
--前后两次执行wrap_test()时，有不同的结果。

--[[
    load (chunk [, chunkname [, mode [, env]]])
    --加载chunk模块，env作为上值，旧的值直接保存在env中，更新新的chunk块，如果env为nil，
    --默认以全局环境_ENV作为其上值，这样chunk块代码共享全局变量。如果以元表{__index = _ENV}作为env，
    --chunk模块仍然可以共享全局变量，但是加载后的全局环境却没有chunk块中的全局变量。
]]

